package robot;

import environnement.Environnement;
import graphique.IDessinable;

import java.awt.Graphics2D;

import robot.io.capteurs.ICapteur;
import robot.io.infos.IInfos;
import robot.io.sorties.ISortie;

public interface IRobot extends IDessinable {
	  
	  //
	  // Methods
	  //


	  //
	  // Accessor methods
	  //

	  /**
	   * Set the value of x
	   * Absisse du robot
	   * @param newVar the new value of x
	   */
	  public void setX ( int newVar ) ;

	  /**
	   * Get the value of x
	   * Absisse du robot
	   * @return the value of x
	   */
	  public int getX ( ) ;

	  /**
	   * Set the value of y
	   * Ordonné du robot
	   * @param newVar the new value of y
	   */
	  public void setY ( int newVar ) ;

	  /**
	   * Get the value of y
	   * Ordonné du robot
	   * @return the value of y
	   */
	  public int getY ( ) ;
	  
	  /**
	   * Retourne la valeur correspondant à la clé key
	   * @param key
	   * @return
	   */
	  public int getIndex( String key ) ;
	  
	  /**
	   * Modifie la valeur correspondant à la clé
	   * @param key
	   * @param valeur
	   */
	  public void setIndex( String key, int valeur ) ;
	  
	  /**
	   * Set the value of matricePoids
	   * Matrice des poids du robot (pour le réseau de neurones)
	   * @param newVar the new value of matricePoids
	   */
	  public void setMatricePoids ( double[][] newVar ) ;

	  /**
	   * Get the value of matricePoids
	   * Matrice des poids du robot (pour le réseau de neurones)
	   * @return the value of matricePoids
	   */
	  public double[][] getMatricePoids ( ) ;

	  /**
	   * Set the value of listeInfos
	   * Liste des informations supplémentaires
	   * @param newVar the new value of listeInfos
	   */
	  public void setListeInfos ( IInfos[] newVar ) ;

	  /**
	   * Get the value of listeInfos
	   * Liste des informations supplémentaires
	   * @return the value of listeInfos
	   */
	  public IInfos[] getListeInfos ( ) ;

	  /**
	   * Set the value of listeCapteurs
	   * Liste des capteurs
	   * @param newVar the new value of listeCapteurs
	   */
	  public void setListeCapteurs ( ICapteur[] newVar ) ;
	  /**
	   * Get the value of listeCapteurs
	   * Liste des capteurs
	   * @return the value of listeCapteurs
	   */
	  public ICapteur[] getListeCapteurs ( ) ;

	  /**
	   * Set the value of liste_Sorties
	   * Liste des sorties
	   * @param newVar the new value of liste_Sorties
	   */
	  public void setListe_Sorties ( ISortie[] newVar ) ;

	  /**
	   * Get the value of liste_Sorties
	   * Liste des sorties
	   * @return the value of liste_Sorties
	   */
	  public ISortie[] getListe_Sorties ( ) ;

	  /**
	   * Set the value of score
	   * @param newVar the new value of score
	   */
	  public void setScore ( double newVar ) ;

	  /**
	   * Get the value of score
	   * @return the value of score
	   */
	  public double getScore ( ) ;

	  //
	  // Other methods
	  //

	  /**
	   * Calcul du score du robot
	   * @return       int
	   * @param        robot Robot
	   */
	  public double calculScore( );


	  /**
	   * Dessine le robot dans l'environnement
	   */
	  public void dessiner( Graphics2D gr) ;

	  /**
	   * Methode d'execution des actions du robot
	   */
	  public void executeActions(IRobot robot) ;
	  
	  /**
	   * Methode de mise à jour des capteurs du robot
	   */
	  public void updateCapteurs(IRobot robot) ;
	  
	  /**
	   * Methode de mise à jour des Informations du robot
	   */
	  public void updateInfos(IRobot robot) ;
	  
	  /**
	   * Retourne les valeurs des neurones
	   */
	  public double[] getValeursNeurones() ;

	  /**
	   * Modifie les valeurs des neurones
	   */
	  public void setValeursNeurones( double[] valeurs ) ;
}
